//#include<iostream>
//#include<algorithm>
//#include<vector>
//#include<stack>
//using namespace std;
//int main()
//{
//	ios::sync_with_stdio(false);
//	cin.tie(nullptr);
//	cout.tie(nullptr);
//	int n;
//	stack<int> st;
//	vector<int> vc;
//	cin >> n;
//	while (n--)
//	{
//		string s;
//		cin >> s;
//		if (s == "Push")
//		{
//			int x;
//			cin >> x;
//			st.push(x);
//			vc.insert(lower_bound(vc.begin(), vc.end(), x), x);
//		}
//		else {
//			if (s == "Pop")
//			{
//				if (st.empty())
//				{
//					cout << "Invalid" << endl;
//				}
//				else {
//					cout << st.top() << endl;
//					vc.erase(lower_bound(vc.begin(), vc.end(), st.top()));
//					st.pop();
//				}
//			}
//			else {
//				if (st.empty())
//				{
//					cout << "Invalid" << endl;
//				}
//				else {
//					int sz = st.size();
//					if (sz % 2 == 0)
//					{
//						cout << vc[sz / 2 - 1] << endl;
//					}
//					else {
//						
//						cout << vc[sz / 2] << endl;
//					}
//				}
//			}
//		}
//		
//	}
//	return 0;
//}

//#include<iostream>
//#include<algorithm>
//using namespace std;
//typedef long long ll;
//const int N = 5e5 + 10;
//int a[N], s[N];
//int n, m;
//int lowbit(int x)
//{
//	return x & -x;
//}
//void change(int x, int k)
//{
//	while (x <= n)
//	{
//		s[x] += k;
//		x += lowbit(x);
//	}
//}
//ll quiry(int x)
//{
//	ll k = 0;
//	while (x >= 1)
//	{
//		k += s[x];
//		x -= lowbit(x);
//	}
//	return k;
//}
//int main()
//{
//	cin >> n >> m;
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> a[i];
//		change(i, a[i]);
//	}
//	while (m--)
//	{
//		int op, x, y;
//		cin >> op >> x >> y;
//		if (op == 1)
//		{
//			change(x, y);
//		}
//		else {
//			cout << quiry(y) - quiry(x - 1) << endl;
//		}
//	}
//	return 0;
//}

//#include<iostream>
//#include<algorithm>
//using namespace std;
//typedef long long ll;
//const int N = 5e5 + 10;
//int a[N], s[N];
//int n, m;
//int lowbit(int x)
//{
//	return x & -x;
//}
//void change(int x, int k)
//{
//	while (x <= n)
//	{
//		s[x] += k;
//		x += lowbit(x);
//	}
//}
//ll quiry(int x)
//{
//	ll k = 0;
//	while (x >= 1)
//	{
//		k += s[x];
//		x -= lowbit(x);
//	}
//	return k;
//}
//int main()
//{
//	cin >> n >> m;
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> a[i];
//	}
//	while (m--)
//	{
//		int op, x;
//		cin >> op >> x;
//		if (op == 1)
//		{
//			int y, k;
//			cin >> y >> k;
//			change(x, k);
//			change(y + 1, -k);
//		}
//		else {
//			cout << a[x] + quiry(x) << endl;
//		}
//	}
//	return 0;
//}

//#define _CRT_SECURE_NO_WARNINGS  1
//#include<iostream>
//using namespace std;
//const int N = 1e7;
//int main()
//{
//	int a, b, c;
//	int x, y, z;
//	scanf("%d.%d.%d %d.%d.%d", &a, &b, &c, &x, &y, &z);
//	if ((c + z) / 29 > 0)
//	{
//		b += ((c + z) / 29);
//	}
//	c = (c + z) % 29;
//	if ((b + y) / 17 > 0)
//	{
//		a += ((b + y) / 17);
//	}
//	b = (b + y) % 17;
//	a = (a + x);
//	printf("%d.%d.%d", a, b, c);
//	return 0;
//}

//#include<iostream>
//#include<cmath>
//#include<algorithm>
//using namespace std;
//typedef long long ll;
//int main()
//{
//	ll n;
//	cin >> n;
//	cout << n << "=";
//	if (n == 1)
//	{
//		cout << n;
//	}
//	bool vis = true;
//	for (int i = 2; i <= sqrt(n); i++)
//	{
//		if (n % i == 0)
//		{
//			int s = 0;
//			while (n % i == 0)
//			{
//				s++;
//				n /= i;
//			}
//			if (vis) vis = false;
//			else cout << "*";
//			cout << i;
//			if (s > 1)
//			{
//				cout << "^" << s;
//			}
//		}
//	}
//	if (n > 1)
//	{
//		if (vis) cout << n;
//		else cout << "*" << n;
//	}
//	return 0;
//}

//#include<iostream>
//#include<algorithm>
//#include<vector>
//using namespace std;
//vector<int> vc;
//int n;
//void Inorder(int x)
//{
//	if (x >= n)
//	{
//		return;
//	}
//	Inorder(2 * x + 1);
//	vc.push_back(x);
//	Inorder(2 * x + 2);
//}
//int main()
//{
//	cin >> n;
//	vector<int> a(n);
//	vector<int> b(n);
//	for (int i = 0; i < n; i++)
//	{
//		cin >> a[i];
//	}
//	sort(a.begin(), a.end());
//	Inorder(0);
//	for (int i = 0; i < vc.size(); i++)
//	{
//		b[vc[i]] = a[i];
//	}
//	cout << b[0];
//	for (int i = 1; i < b.size(); i++)
//	{
//		cout << " " << b[i];
//	}
//	return 0;
//}

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 1e4 + 10;
int a[N];
int main()
{
	int n, m;
	cin >> n >> m;
	vector<vector<int>> f(n + 1, vector<int>(m + 1, -1));
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	sort(a + 1, a + 1 + n, [](const int& a, const int& b) { return a > b; });
	f[0][0] = 0;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 0; j <= m; j++)
		{
			f[i][j] = f[i - 1][j];
			if (a[i] <= j)
			{
				f[i][j] = max(f[i][j], f[i - 1][j - a[i]] + a[i]);
			}
		}
	}
	if (f[n][m] != m) {
		cout << "No Solution";
	}
	else {
		int pos = m;
		bool vis = true;
		for (int i = n; i >= 1 && pos > 0; i--)
		{
			if (pos >= a[i] && f[i][pos] == f[i - 1][pos - a[i]] + a[i])
			{
				if (vis) {
					cout << a[i];
					vis = false;
				}
				else cout << " " << a[i];
				pos -= a[i];
			}
		}
	}
	return 0;
}